package com.jprocms.module.cms.framework.tree;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;

import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;

/**
 * @author jprocms
 */
public interface TreeService<T> {

    /**
     * 根据父节点id生成path
     *
     * @param parentId
     * @return
     */
    String generatePath(Serializable parentId);

    /**
     * 查询当前id节点的上级节点
     *
     * @param id
     * @param containSelf 是否包含自己
     * @return
     */
    List<T> findParentNodesById(@NotNull Serializable id, boolean containSelf);

    /**
     * 查询当前id节点的下级节点
     *
     * @param id
     * @param containSelf 是否包含自己
     * @return
     */
    List<T> findChildrenById(@NotNull Serializable id, boolean containSelf);

    List<? extends Serializable> findChildrenIdById(@NotNull Serializable id, boolean containSelf);

    /**
     * 根据path查询子节点
     *
     * @param wrapper 拼装的查询对象
     * @param path
     * @return
     */
    List<T> listByPath(@NotNull LambdaQueryWrapper<T> wrapper, @NotNull String path);

    /**
     * 保存树节点对象
     *
     * @param entity
     * @return
     */
    boolean save(T entity);

    /**
     * 当节点的parentId发生变更时
     * 级联更新字节点的path属性
     *
     * @param oldPath 当前节点的parentId变更之前的path
     * @param newPath 当前节点的parentId变更之后的path
     * @param id      当前节点记录的id
     */
    void updateChildrenPath(@NotNull String oldPath, @NotNull String newPath, @NotNull Long id);

}
